package org.example.c05集合;

import org.junit.Test;

import java.util.HashMap;

/**
 * 得益于 Java 8 的 default 方法特性，Java 8 对 Map 增加了不少实用的默认方法
 *
 * @author yuanwl
 * @date 2019-06-19 12:01
 */
public class MapNewMethods {

	@Test
	public void compute() {
		HashMap<String, Integer> map = new HashMap<>();
		map.put("1", 1);
		map.put("2", 2);
		map.put("3", 3);

		Integer i3 = map.compute("3", (k, v) -> v + 1);
		//key不管存在不在都会执行后面的函数，并保存到map中
		Integer i4 = map.compute("4", (k, v) -> {
			if (v == null) return 0;
			return v + 1;
		});

		System.out.println(i3); //4
		System.out.println(i4); //0
		System.out.println(map); //{1=1, 2=2, 3=4, 4=0}
	}

	@Test
	public void computeIfAbsent() { //absent: 缺席的, 缺少的
		HashMap<String, Integer> map = new HashMap<>();
		map.put("1", 1);
		map.put("2", 2);
		map.put("3", 3);

		Integer i3 = map.computeIfAbsent("3", key -> new Integer(4));//key存在返回value
		Integer i4 = map.computeIfAbsent("4", key -> new Integer(4));//key不存在执行函数存入map

		System.out.println(i3); //3
		System.out.println(i4); //4
		System.out.println(map.toString()); //{1=1, 2=2, 3=3, 4=4}
	}

	@Test
	public void computeIfPresent() { //present: 出席的, 和computeIfAbsent方法正好相反
		HashMap<String, Integer> map = new HashMap<>();
		map.put("1", 1);
		map.put("2", 2);
		map.put("3", 3);

		//只对map中存在的key对应的value进行操作
		Integer i3 = map.computeIfPresent("3", (k, v) -> v + 1);
		//key 不存在, 就没有执行 lambda 表达式
		Integer i4 = map.computeIfPresent("4", (k, v) -> {
			if (v == null) return 0;
			return v + 1;
		});

		System.out.println(i3); //4
		System.out.println(i4); //null
		System.out.println(map.toString()); //{1=1, 2=2, 3=4}
	}

	@Test
	public void putIfAbsent() {
		HashMap<String, Integer> map = new HashMap<>();
		map.put(null, 100);
		map.put("1", 1);
		map.put("2", 2);
		map.put("3", 3);

		//只有在key不存在的时候，value值才会被插入--返回的是旧值
		Integer inull = map.putIfAbsent(null, 99); //key 存在, 即使是 null, value 也不会被覆盖
		Integer i3 = map.putIfAbsent("3", 33); //key 存在, value 不会被覆盖
		Integer i4 = map.putIfAbsent("4", 44); //key 不存在, value 被插入

		System.out.println(inull); //100
		System.out.println(i3); //3
		System.out.println(i4); //null
		System.out.println(map.toString()); //{null=100, 1=1, 2=2, 3=3, 4=44}
	}

}
